package ufg.inf.es.agenda.presistencia;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import ufg.inf.es.agenda.Model.Endereco;
import ufg.inf.es.agenda.Model.Pessoa;
import ufg.inf.es.agenda.Model.Telefone;

/**
 * Classe para conexão com banco de dados
 *
 * @author wilker
 */
public class Conexao {

    private static Conexao conexao;
    private static SessionFactory factory;

    static {
        try {
            AnnotationConfiguration config = new AnnotationConfiguration();
            config.addAnnotatedClass(Endereco.class);
            config.addAnnotatedClass(Pessoa.class);
            config.addAnnotatedClass(Telefone.class);
            factory = config.buildSessionFactory();
            factory.openSession();
        } catch (Exception ex) {
            ex.printStackTrace();
            factory = null;
        }
    }

    private Conexao() {
    }

    /**
     * Retorna a Conexão estabelecida com o SGBD
     *
     * @return conexão
     */
    public static Conexao getConexao() {
        if (conexao == null) {
            conexao = new Conexao();
        }
        return conexao;
    }

    /**
     * Retorna a Sessão na qual a conexão foi estabelecida
     *
     * @return Sessão da conexão
     */
    public static Session getSessao() {
        Session sessaoAtual;
        try {
            sessaoAtual = factory.getCurrentSession();
        } catch (Exception ex) {
            sessaoAtual = factory.openSession();
        }
        return sessaoAtual;
    }
}
